"""
从现有智能体获取完整的 ModelConfig 配置模板

这个脚本用于解决 API 文档中 app.ModelConfig 结构说明缺失的问题。
通过获取现有智能体的配置，我们可以了解完整的必需字段。
"""
import os
import sys
import json

# 添加项目路径
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, project_root)

from src.llm.hiagent_app.utils.api_client import HiAgentAPIClient
from src.llm.hiagent_app.services.personal_agent_service import PersonalAgentService


def get_model_config_template():
    """从现有智能体获取 ModelConfig 模板"""
    service = PersonalAgentService()

    print("[开始] 获取 ModelConfig 模板...")

    # 获取智能体列表
    print("\n[步骤1] 获取智能体列表...")
    apps, total = service.list_personal_agents()

    if not apps:
        print("[错误] 没有找到现有智能体")
        print("   提示: 请先在系统中创建至少一个智能体")
        return None

    print(f"[信息] 找到 {total} 个智能体")

    # 遍历智能体，找到一个有配置的
    api_client = service.api_client
    template_app = None
    app_config = None
    model_config = None
    model_id = None

    print(f"\n[步骤2] 遍历智能体查找有效配置...")

    for idx, app in enumerate(apps[:10], 1):  # 只检查前10个
        print(f"   [{idx}/{min(10, len(apps))}] 检查: {app.name} ({app.app_id})")

        try:
            # 尝试获取草稿配置
            response = api_client.make_request("GetAppSingleModeDraft", {
                "WorkspaceID": api_client.config.DEFAULT_WORKSPACE_ID,
                "AppID": app.app_id
            })

            app_config_draft = response.get("AppConfigDraft", {})

            if app_config_draft and app_config_draft.get("ModelConfig"):
                print("       -> 找到草稿配置")
                template_app = app
                app_config = app_config_draft
                model_config = app_config.get("ModelConfig", {})
                model_id = app_config.get("ModelID", "N/A")
                break

            # 尝试获取已发布配置
            response2 = api_client.make_request("GetAppConfig", {
                "WorkspaceID": api_client.config.DEFAULT_WORKSPACE_ID,
                "AppID": app.app_id
            })

            app_config_info = response2.get("AppConfigInfo", {})

            if app_config_info and app_config_info.get("ModelConfig"):
                print("       -> 找到已发布配置")
                template_app = app
                app_config = app_config_info
                model_config = app_config.get("ModelConfig", {})
                model_id = app_config.get("ModelID", "N/A")
                break

        except Exception as e:
            print(f"       -> 失败: {e}")
            continue

    if not model_config:
        print("\n[错误] 未找到任何有效的 ModelConfig")
        print("   提示: 请确保至少有一个智能体已经配置了模型")
        return None

    print(f"\n[成功] 使用智能体: {template_app.name}")
    print(f"   ID: {template_app.app_id}")
    print(f"   模型: {model_id}")

    # 打印完整配置
    print(f"\n" + "=" * 60)
    print("完整的 AppConfigInfo 结构:")
    print("=" * 60)
    print(json.dumps(app_config, indent=2, ensure_ascii=False))

    # 打印 ModelConfig
    print(f"\n" + "=" * 60)
    print("ModelConfig 结构（当前使用模型: {}）:".format(model_id))
    print("=" * 60)
    print(json.dumps(model_config, indent=2, ensure_ascii=False))

    # 列出所有字段
    print(f"\n" + "=" * 60)
    print("ModelConfig 包含的字段:")
    print("=" * 60)
    for key, value in model_config.items():
        value_type = type(value).__name__
        print(f"   {key}: {value_type} = {value}")

    # 生成Python代码模板
    print(f"\n" + "=" * 60)
    print("Python 代码模板（用于创建新智能体）:")
    print("=" * 60)
    print("# 参考文档: docs/v2.1.0-llmops-app-server-api_doc.md 第 22296-22320 行")
    print("model_config = {")

    # 字段说明映射（根据官方文档）
    field_comments = {
        "Temperature": "随机性（必需），范围 0-1",
        "TopP": "核采样（必需），范围 0-1",
        "MaxTokens": "单次回复token数（必需）",
        "RoundsReserved": "对话轮数保留（必需）",
        "RagNum": "RAG检索数量（必需）",
        "Strategy": "策略（必需），默认 react",
        "MaxIterations": "最大迭代次数（必需），范围 1-5",
        "RagEnabled": "RAG开关（必需），默认 false",
        "ReasoningMode": "长思考过程展示开关（可选）",
        "ReasoningSwitch": "开始深度思考开关（可选）",
        "IsAdvancedMode": "是否高级模式（可选），默认 false",
        "ReasoningSwitchType": "深度思考模式（可选）: auto/enabled/disabled",
        "CurrentTimeEnabled": "当前时间开关（可选），默认 false",
    }

    for key, value in model_config.items():
        comment = field_comments.get(key, "")
        if isinstance(value, str):
            print(f'    "{key}": "{value}",  # {comment}')
        else:
            print(f'    "{key}": {value},  # {comment}')
    print("}")

    print(f"\n" + "=" * 60)
    print("使用建议:")
    print("=" * 60)
    print("1. 复制上面的 model_config 模板")
    print("2. 在创建新智能体时，将 ModelID 改为 'doubao-seed-1-6'")
    print("3. 所有标记为（必需）的字段都必须提供")
    print("4. 可选字段可以省略，系统会使用默认值")
    print("5. 字段定义参考官方文档: docs/v2.1.0-llmops-app-server-api_doc.md")
    print(f"=" * 60)

    return model_config


def save_template_to_file(model_config, filename="model_config_template.json"):
    """将模板保存到文件"""
    if not model_config:
        return False

    try:
        output_path = os.path.join(
            os.path.dirname(__file__),
            filename
        )

        with open(output_path, 'w', encoding='utf-8') as f:
            json.dump(model_config, f, indent=2, ensure_ascii=False)

        print(f"\n[成功] 模板已保存到: {output_path}")
        return True

    except Exception as e:
        print(f"[错误] 保存文件失败: {e}")
        return False


def main():
    """主函数"""
    print("=" * 60)
    print("获取 ModelConfig 完整模板")
    print("=" * 60)

    # 获取模板
    model_config = get_model_config_template()

    # 保存到文件
    if model_config:
        save_template_to_file(model_config)

    print("\n" + "=" * 60)


if __name__ == "__main__":
    main()
